package com.wy.qq_6_0_sideslip;

import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;

/**
 * description:
 * 仿QQ6.0主页面侧滑的自定View
 * Created by 曾辉 on 2016/11/1.
 * QQ：240336124
 * Email: 240336124@qq.com
 * Version：1.0
 */
public class SlidingMenu extends HorizontalScrollView {

    private String TAG = "SlidingMenu";

    private View mMenuView;
    private View mContentView;
    private int mMenuWidth;

    // 手势处理类 主要用来处理手势快速滑动
    private GestureDetector mGestureDetector;

    // 菜单是否打开
    private boolean mMenuIsOpen = false;

    public SlidingMenu(Context context) {
        this(context, null, 0);
    }

    public SlidingMenu(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SlidingMenu);
        float rightPadding = array.getDimension(R.styleable.SlidingMenu_rightPadding, 100);
        mMenuWidth = (int) (getScreenWidth() - rightPadding);
        array.recycle();

        // 实例化手势处理类
        mGestureDetector = new GestureDetector(context, new GestureListener());
    }

    /**
     * 把dip 转成像素
     */
    private float dip2px(int dip) {
        return TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, dip, getResources().getDisplayMetrics());
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        // 1.获取根View也就是外层的LinearLayout
        ViewGroup container = (ViewGroup) this.getChildAt(0);

        int containerChildCount = container.getChildCount();
        if (containerChildCount > 2) {
            // 里面只允许放置两个布局  一个是Menu(菜单布局) 一个是Content（主页内容布局）
            throw new IllegalStateException("SlidingMenu 根布局LinearLayout下面只允许两个布局,菜单布局和主页内容布局");
        }

        // 2.获取菜单和内容布局
        mMenuView = container.getChildAt(0);
        mContentView = container.getChildAt(1);

        // 3.指定内容和菜单布局的宽度
        // 3.1 菜单的宽度 = 屏幕的宽度 - 自定义的右边留出的宽度
        mMenuView.getLayoutParams().width = mMenuWidth;
        // 3.2 内容的宽度 = 屏幕的宽度
        mContentView.getLayoutParams().width = getScreenWidth();

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        // 处理手指快速滑动
        if (mGestureDetector.onTouchEvent(ev)) {
            return mGestureDetector.onTouchEvent(ev);
        }

        switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
                // 手指抬起获取滚动的位置
                int currentScrollX = getScrollX();
                if (currentScrollX > mMenuWidth / 2) {
                    // 关闭菜单
                    closeMenu();
                } else {
                    // 打开菜单
                    openMenu();
                }
                return false;
        }
        return super.onTouchEvent(ev);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        // 布局指定后会从新摆放子布局，当其摆放完毕后，让菜单滚动到不可见状态
        if (changed) {
            scrollTo(mMenuWidth, 0);
        }
    }

    /**
     * 实现菜单左边抽屉样式的动画效果
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);

        // l 是 当前滚动的x距离  在滚动的时候会不断反复的回调这个方法
        Log.e(TAG, l + "");

        mMenuView.setTranslationX(l * 0.8f);
    }

    /**
     * 获取屏幕的宽度
     */
    public int getScreenWidth() {
        Resources resources = this.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        return dm.widthPixels;
    }

    /**
     * 打开菜单
     */
    private void openMenu() {
        smoothScrollTo(0, 0);
        mMenuIsOpen = true;
    }

    /**
     * 关闭菜单
     */
    private void closeMenu() {
        smoothScrollTo(mMenuWidth, 0);
        mMenuIsOpen = false;
    }

    private class GestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            // 当手指快速滑动时候回调的方法
            Log.e(TAG, velocityX + "");
            // 如果菜单打开 并且是向左快速滑动 切换菜单的状态
            if (mMenuIsOpen) {
                if (velocityX < -500) {
                    toggleMenu();
                    return true;
                }
            } else {
                // 如果菜单关闭 并且是向右快速滑动 切换菜单的状态
                if (velocityX > 500) {
                    toggleMenu();
                    return true;
                }
            }

            return false;
        }
    }

    /**
     * 切换菜单的状态
     */
    private void toggleMenu() {
        if (mMenuIsOpen) {
            closeMenu();
        } else {
            openMenu();
        }
    }

}
